Conversation
The global object in repl conetxt is copied from main context, which breaks the behavior of `instanceof`. This change reverts nodejs#25731. Fixes: nodejs#27859 Refs: nodejs#25731
|
@starkwang the problem is something fundamental with our current REPL design. There is no perfect fix for the mentioned issue and reverting this commit would only fix a part of the reported issue. It also does not seem to be a good idea to do a complete revert of that commit, since it improved some autocompletion things. The former global list worked as exclusion list. The list would easily become outdated and what we really want is to exclude all original primordial keys, even when the language adds new built-ins. We extend our global object with e.g., That is possible with the following patch: diff --git a/lib/repl.js b/lib/repl.js
index 12461d67de..6293363640 100644
--- a/lib/repl.js
+++ b/lib/repl.js
@@ -875,8 +875,11 @@ REPLServer.prototype.createContext = function() {
context = vm.createContext();
});
for (const name of Object.getOwnPropertyNames(global)) {
- Object.defineProperty(context, name,
- Object.getOwnPropertyDescriptor(global, name));
+ // Only set properties on the context that do not exist as primordial.
+ if (!(name in primordials)) {
+ Object.defineProperty(context, name,
+ Object.getOwnPropertyDescriptor(global, name));
+ }
}
context.global = context;
const _console = new Console(this.outputStream);
diff --git a/test/parallel/test-repl-context.js b/test/parallel/test-repl-context.js
index 287d8adc29..88bd47a928 100644
--- a/test/parallel/test-repl-context.js
+++ b/test/parallel/test-repl-context.js
@@ -16,11 +16,21 @@ const stream = new ArrayStream();
useGlobal: false
});
+ let output = '';
+ stream.write = function(d) {
+ output += d;
+ };
+
// Ensure that the repl context gets its own "console" instance.
assert(r.context.console);
// Ensure that the repl console instance is not the global one.
assert.notStrictEqual(r.context.console, console);
+ assert.notStrictEqual(r.context.Object, Object);
+
+ stream.run(['({} instanceof Object)']);
+
+ assert.strictEqual(output, 'true\n> ');
const context = r.createContext();
// Ensure that the repl context gets its own "console" instance.We extend the global primordial object with extra functions like |
The global object in repl conetxt is copied from main context, which breaks the behavior of
instanceof.This change reverts #25731. cc @BridgeAR
Fixes: #27859
Refs: #25731
Checklist
make -j4 test(UNIX), orvcbuild test(Windows) passes